# 局部变量
"""

可变参数
    *args :默认装进一个元组();就是一个容器
    *kwargs
    argument

一颗星：*
    拆装包

        装包：
            def 函数(*arg): ---------->此时会出现装包操作
                pass
        拆包：list、tuple、set
            函数调用时：函数(*list)|函数(*tuple)|函数(*set)
                print(sm(1, *ram_lst))  # 调用加一个* 拆包
        拆包过程
两颗星：** #<class 'dict'>
    *kwargs：key word 关键字参数

    关键字参数赋值才可以；只要不是关键字参数会报错
    只有传递参数时key=value形式，才可以装包放进放到字典中

    只有** 才会装包

"""


# 多参数：求和
def sm(a, *args):
    print(type(args))  # args:是元组 <class 'tuple'>
    return a + sum(args)


print(sm(1, 2, 3, 4, 5))

x, *y, z = 1, 2, 3, 4, 5
print(x, y, z)  # 默认是放到列表中：1 [2, 3, 4] 5

# 拆包
x, y, z = (7, 8, 9)
print(x, y, z)  # 7 8 9
# 先拆包、后装包
x, *y, z = (7, 8, 9, 2, 3, 4, 5)  # 先拆包、后装包
print(x, y, z)  # 7 [8, 9, 2, 3, 4] 5

# 列表中元素的和
ram_lst = [12, 4, 6, 8, 345, 678, 24, 67, 1, 23]
print(sum(ram_lst))  # 1168

print(sm(1, *ram_lst))  # 调用加一个* 拆包

print("两颗星：**".center(30, "—"))


def show_book(**kwargs):  # <class 'dict'> # 关键字参数赋值才可以；只要不是关键字参数会报错
    print(type(kwargs))
    print(kwargs)

    for k, v in kwargs.items():
        print(k, v, sep='->')


# 字典装包
show_book(name='张三', age=18, sex='男')  # 关键字参数赋值才可以；只要不是关键字参数会报错  name->张三   age->18 sex->男

# 字典拆包
book = {'name': '西游记', 'author': '曹雪芹', 'number': 5}
show_book(**book)  # 拆包

print("单星* 和两颗星：**都存在".center(50, "—"))


def show_all_book(*args, **kwargs):
    print(type(args))  # <class 'tuple'>
    print(type(kwargs))  # <class 'dict'>
    print(args)  # ()
    print(kwargs)  # {}


book = {'name': '红楼梦', 'author': '曹雪芹'}
show_all_book('张三', '李四', **book)
show_all_book('张三', '李四', **{'name': '红楼梦', 'author': '曹雪芹'})  # 只有** 才会装包

print('{}{}{}'.format('AA', 'BB', 'CC'))
print('{name}->{age}'.format(**{'name': '张三', 'age': 18}))
